//自己
#include <iostream>
#include <vector>
using namespace std;

int main() {
    //1.读取
    int n=0, q=0;
    cin >> n >> q;// 空格/回车 作分隔
    //多开辟1个, 题目数组 和 dp数组下标最好都从1开始, 防止下面越界
    vector<int> v1(n+1, 0);//初始化+提前开辟空间
    for (int i=1; i<=n; i++)
    {
        cin >> v1[i];
    }
    //2.求dp数组, (v1[0], v1[i])的和
    vector<long long> dp(n+1, 0);
    for (int i=1; i<=n; i++)
    {
        dp[i] = dp[i-1] + v1[i];//和可能超过INT_MAX //i从1开始, 防越界, v1,dp元素要相对应
    }
    //3.开始计算, 各区间和
    for (int i=0; i<q; i++)//每次读取2个元素, 共2*q个元素, 读q次
    {
        int left=0, right=0;
        cin >> left >> right;
        cout << dp[right] - dp[left-1] << endl;
    }

    return 0;
}



//答案
#include <iostream>
#include <vector>
using namespace std;

int main() {
    //1.读取
    int n=0, q=0;
    cin >> n >> q;// 空格/回车 作分隔
    //多开辟1个, 题目数组 和 dp数组下标最好都从1开始, 防止下面越界
    vector<int> v1(n+1);//初始化+提前开辟空间
    for (int i=1; i<=n; i++)
        cin >> v1[i];

    //2.预处理出一个前缀和(dp)数组, (v1[0], v1[i])的和
    vector<long long> dp(n+1);//vector第二个是缺省参数会自动初始化成0
    for (int i=1; i<=n; i++)
        dp[i] = dp[i-1] + v1[i];//和可能超过INT_MAX //i从1开始, 防越界, v1,dp元素要相对应
    
    //3.使用前缀和数组计算, 各区间和
    int left=0, right=0;
    while (q--)//每次读取2个元素, 共2*q个元素, 读q次
    {
        cin >> left >> right;
        cout << dp[right] - dp[left-1] << endl;
    }

    return 0;
}
// 64 位输出请用 printf("%lld")
//时间: O(n*q)
//空间: O(2n)